//  DOCUMENTACIÓN  --------------------------------------------------
/*
  ARCHIVO: UE5_A1_ENUN.java
  EFECTO: Problemas básicos de recorrido iterativo.
  AUTOR: JMB
  GRUPO:
  FECHA_CREACIÓN: 26/11/2010
  FECHA_ÚLTIMA_MODIFICACIÓN: 13/10/2016
*/

//  USO: UE5_A1_ENUN ue51 = new UE5_A1_ENUN ()

class UE5_A1_ENUN
{
  
//  DECLARACIONES DE CONSTANTES  ------------------------------------ 
  
//  DECLARACION DE FUNCIONES  ---------------------------------------

/*
 * FUNCION factorial (Natural n) ---> Natural
 * PRE: cierto
 * POST1: resultado = n!
 * POST2: resultado = MUL j IN [1,n] . j
*/

/*
 * FUNCION producto (Natural m, n) ---> Natural
 * PRE: cierto
 * POST1: resultado = m * n
 * POST2: resultado = SUM j IN [1,n] . m
*/

/*
 * FUNCION factorialAPedal (Natural n) ---> Natural
 * PRE: cierto
 * POST1: resultado = n!
 * POST2: resultado = MUL j IN [1,n] . j
*/

/*
 * FUNCION variaciones (Natural m, n) ---> Natural
 * PRE: (m>0)/\(n>0)/\(m>=n)
 * POST1: resultado = MUL i IN [(m-n+1),m] . i
*/

/*
 * FUNCION potencia (Natural base, exponente) ---> Natural
 * PRE: base > 0
 * POST: resultado = MUL i IN [1,exponente] . base
*/

/*
 * FUNCION digitoI (Natural i,n) ---> Natural
 * PRE: i IN [1,NC(n)]
 * POST: resultado = Resto (Cociente (n,Potencia (10,i-1),10)
*/
  static int digitoI (int i, int n)
  {
    return (n / (int)(Math.pow (10,i-1))) % 10;
  }
/*
 * FUNCION numeroCifras (Natural numero) ---> Natural
 * PRE: cierto
 * POST: ((numero=0)/\(r=1)) \/ ((numero>0)/\(r>0)/\(10^r-1 <= 10^r))
*/

/*
 * FUNCION anillosDigito (Natural digito) ---> Natural
 * PRE : digito <= 9
 *                   | 2  si digito IN {8}
 * POST: resultado = | 1  si digito IN {0,6,9}
 *                   | 0  si digito IN {1,2,3,4,5,7}
*/
  static int anillosDigito (int d)
  {
    if (d == 8)
      return 2;
    else if ((d == 0) || (d == 6) || (d == 9))
      return 1;
    else
      return 0;
  }
/*
 * FUNCION anillosNumero1 (Natural n) ---> Natural
 * PRE: cierto
 * POST: res = SUM i IN [1,NCifras(n)] | AnillosDigito (Cifra (i,n))
*/

/*
 * FUNCION anillosNumero2 (Natural n) ---> Natural
 * PRE: cierto
 * POST: res = SUM i IN [1,NCifras(n)] | AnillosDigito (Cifra (i,n))
*/


//  DECLARACIONES DE PRUEBAS  ---------------------------------------

  static int prueba1_1 = factorial(5);
  static int prueba1_2 = factorial(0);
  static boolean prueba1_factorial = (prueba1_1 == 120) &&
                                     (prueba1_2 == 1);
  static int prueba2_1 = variaciones(6,2);
  static int prueba2_2 = variaciones(6,5);
  static boolean prueba2_variaciones = (prueba2_1 == 30) &&
                                       (prueba2_2 == 720);
  static int prueba3_1 = producto(5,12);
  static int prueba3_2 = producto(12,5);
  static boolean prueba3_producto = (prueba3_1 == 60) &&
                                    (prueba3_2 == 60);
  static int prueba4_1 = factorialAPedal(5);
  static int prueba4_2 = factorialAPedal(0);
  static boolean prueba4_factorialAPedal = (prueba4_1 == 120) &&
                                           (prueba4_2 == 1);
  static int prueba5_1 = potencia(6,0);
  static int prueba5_2 = potencia(6,2);
  static boolean prueba5_potencia = (prueba5_1 == 1) &&
                                    (prueba5_2 == 36);
  static int prueba6_1 = numeroCifras(0);
  static int prueba6_2 = numeroCifras(1024);
  static boolean prueba6_numeroCifras = (prueba6_1 == 1) &&
                                        (prueba6_2 == 4);
  static int prueba7_1 = anillosNumero1(0);
  static int prueba7_2 = anillosNumero1(1680);
  static boolean prueba7_anillosNumero1 = (prueba7_1 == 1) &&
                                          (prueba7_2 == 4);
  static int prueba8_1 = anillosNumero2(0);
  static int prueba8_2 = anillosNumero2(1680);
  static boolean prueba8_anillosNumero2 = (prueba8_1 == 1) &&
                                          (prueba8_2 == 4);
  
  //  PROGRAMA PRINCIPAL  ---------------------------------------------

  public static void main (String[] args)
  {
    System.out.println("PRUEBA1_factorial: " + prueba1_factorial);
    System.out.println("PRUEBA2_variaciones: " + prueba2_variaciones);
    System.out.println("PRUEBA3_producto: " + prueba3_producto);
    System.out.println("PRUEBA4_factorialAPedal: " +
                       prueba4_factorialAPedal);
    System.out.println("PRUEBA5_potencia: " + prueba5_potencia);
    System.out.println("PRUEBA6_numeroCifras: " +
                       prueba6_numeroCifras);
    System.out.println("PRUEBA7_anillosNumero1: " +
                       prueba7_anillosNumero1);
    System.out.println("PRUEBA8_anillosNumero2: " +
                       prueba8_anillosNumero2);
  }

}